Algoritmos y Estructura de Datos

Operaciones Insertar, Eliminar y Buscar en LSE


Estos métodos son los mas básicos que podemos crear a partir de la “lógica del puntero”, y la implementación de otros métodos basados en la misma idea queda a gusto (o necesidad) del programador. Por ejemplo, podríamos crear métodos que filtren la lista según una característica de los clientes (como discriminar entre los clientes frecuentes y los no frecuentes), o un método que traspase los datos de los clientes a un archivo de texto para guardarlos, y otro que sea capaz de leer este archivo y llenar una lista con los datos guardados. En fin, hay infinitas posibilidades.

Insertar:

Para añadir un nodo a la lista, primero creamos un nodo, al que llamaremos nodo, que contenga un número por el argumento, al que llamaremos nro. Luego conectamos un nodo con el último nodo de la lista. Para referirnos a éste, creamos un puntero al primer nodo y avanzamos hasta el último.

Ahora que el puntero apunta al último nodo de la lista, haremos que el siguiente nodo al que apunte este último de la lista tome el valor de nuetro nodo a insertar. El proceso para añadir un nodo al principio de la lista es muy parecido e incluso más fácil.

Eliminar:

Para eliminar un nodo X, hay que almacenar en un puntero la ubicación del nodo anterior a este, para luego hacer que apunte al siguiente nodo de X, sacándolo de la lista.

Buscar:

Para buscar un nodo tenemos que recorrer la lista, a traves de un puntero, e ir comparando uno a uno los nodos con el valor de la busqueda y retornar su ubicación de ser encontrado.

Implementación de estas operaciones:
                    
  1. #include <iostream>
  2. #include <stdlib.h>
  3. using namespace std;
  4. struct nodo{
  5. int nro; // en este caso es un numero entero
  6. struct nodo *sgte;
  7. };
  8. typedef struct nodo *Tlista;
  9. void insertarInicio(Tlista &lista, int valor)
  10. {
  11. Tlista q;
  12. q = new(struct nodo);
  13. q->nro = valor;
  14. q->sgte = lista;
  15. lista = q;
  16. }
  17. void insertarFinal(Tlista &lista, int valor)
  18. {
  19. Tlista t, q = new(struct nodo);
  20. q->nro = valor;
  21. q->sgte = NULL;
  22. if(lista==NULL)
  23. {
  24. lista = q;
  25. }
  26. else
  27. {
  28. t = lista;
  29. while(t->sgte!=NULL)
  30. {
  31. t = t->sgte;
  32. }
  33. t->sgte = q;
  34. }
  35. }
  36. int insertarAntesDespues()
  37. {
  38. int _op, band;
  39. cout<<endl;
  40. cout<<"\t 1. Antes de la posicion "<<endl;
  41. cout<<"\t 2. Despues de la posicion "<<endl;
  42. cout<<"\n\t Opcion : "; cin>> _op;
  43. if(_op==1)
  44. band = -1;
  45. else
  46. band = 0;
  47. return band;
  48. }
  49. void insertarElemento(Tlista &lista, int valor, int pos)
  50. {
  51. Tlista q, t;
  52. int i;
  53. q = new(struct nodo);
  54. q->nro = valor;
  55. if(pos==1)
  56. {
  57. q->sgte = lista;
  58. lista = q;
  59. }
  60. else
  61. {
  62. int x = insertarAntesDespues();
  63. t = lista;
  64. for(i=1; t!=NULL; i++)
  65. {
  66. if(i==pos+x)
  67. {
  68. q->sgte = t->sgte;
  69. t->sgte = q;
  70. return;
  71. }
  72. t = t->sgte;
  73. }
  74. }
  75. cout<<" Error...Posicion no encontrada..!"<<endl;
  76. }
  77. void buscarElemento(Tlista lista, int valor)
  78. {
  79. Tlista q = lista;
  80. int i = 1, band = 0;
  81. while(q!=NULL)
  82. {
  83. if(q->nro==valor)
  84. {
  85. cout<<endl<<" Encontrada en posicion "<< i <<endl;
  86. band = 1;
  87. }
  88. q = q->sgte;
  89. i++;
  90. }
  91. if(band==0)
  92. cout<<"\n\n Numero no encontrado..!"<< endl;
  93. }
  94. void reportarLista(Tlista lista)
  95. {
  96. int i = 0;
  97. while(lista != NULL)
  98. {
  99. cout <<' '<< i+1 <<") " << lista->nro << endl;
  100. lista = lista->sgte;
  101. i++;
  102. }
  103. }
  104. void eliminarElemento(Tlista &lista, int valor)
  105. {
  106. Tlista p, ant;
  107. p = lista;
  108. if(lista!=NULL)
  109. {
  110. while(p!=NULL)
  111. {
  112. if(p->nro==valor)
  113. {
  114. if(p==lista)
  115. lista = lista->sgte;
  116. else
  117. ant->sgte = p->sgte;
  118. delete(p);
  119. return;
  120. }
  121. ant = p;
  122. p = p->sgte;
  123. }
  124. }
  125. else
  126. cout<<" Lista vacia..!";
  127. }
  128. void eliminaRepetidos(Tlista &lista, int valor)
  129. {
  130. Tlista q, ant;
  131. q = lista;
  132. ant = lista;
  133. while(q!=NULL)
  134. {
  135. if(q->nro==valor)
  136. {
  137. if(q==lista) // primero elemento
  138. {
  139. lista = lista->sgte;
  140. delete(q);
  141. q = lista;
  142. }
  143. else
  144. {
  145. ant->sgte = q->sgte;
  146. delete(q);
  147. q = ant->sgte;
  148. }
  149. }
  150. else
  151. {
  152. ant = q;
  153. q = q->sgte;
  154. }
  155. }// fin del while
  156. cout<<"\n\n Valores eliminados..!"<<endl;
  157. }
  158. void menu1()
  159. {
  160. cout<<"\n\t\tLISTA ENLAZADA SIMPLE\n\n";
  161. cout<<" 1. INSERTAR AL INICIO "<<endl;
  162. cout<<" 2. INSERTAR AL FINAL "<<endl;
  163. cout<<" 3. INSERTAR EN UNA POSICION "<<endl;
  164. cout<<" 4. REPORTAR LISTA "<<endl;
  165. cout<<" 5. BUSCAR ELEMENTO "<<endl;
  166. cout<<" 6. ELIMINAR ELEMENTO 'V' "<<endl;
  167. cout<<" 7. ELIMINAR ELEMENTOS CON VALOR 'V' "<<endl;
  168. cout<<" 8. SALIR "<<endl;
  169. cout<<"\n INGRESE OPCION: ";
  170. }
  171. /* Funcion Principal
  172. ---------------------------------------------------------------------*/
  173. int main()
  174. {
  175. Tlista lista = NULL;
  176. int op; // opcion del menu
  177. int _dato; // elemenento a ingresar
  178. int pos; // posicion a insertar
  179. system("color 0b");
  180. do
  181. {
  182. menu1(); cin>> op;
  183. switch(op)
  184. {
  185. case 1:
  186. cout<< "\n NUMERO A INSERTAR: "; cin>> _dato;
  187. insertarInicio(lista, _dato);
  188. break;
  189. case 2:
  190. cout<< "\n NUMERO A INSERTAR: "; cin>> _dato;
  191. insertarFinal(lista, _dato );
  192. break;
  193. case 3:
  194. cout<< "\n NUMERO A INSERTAR: ";cin>> _dato;
  195. cout<< " Posicion : "; cin>> pos;
  196. insertarElemento(lista, _dato, pos);
  197. break;
  198. case 4:
  199. cout << "\n\n MOSTRANDO LISTA\n\n";
  200. reportarLista(lista);
  201. break;
  202. case 5:
  203. cout<<"\n Valor a buscar: "; cin>> _dato;
  204. buscarElemento(lista, _dato);
  205. break;
  206. case 6:
  207. cout<<"\n Valor a eliminar: "; cin>> _dato;
  208. eliminarElemento(lista, _dato);
  209. break;
  210. case 7:
  211. cout<<"\n Valor repetido a eliminar: "; cin>> _dato;
  212. eliminaRepetidos(lista, _dato);
  213. break;
  214. }
  215. cout<<endl<<endl;
  216. system("pause"); system("cls");
  217. }while(op!=8);
  218. system("pause");
  219. return 0;
  220. }

Links de apoyo

  • Operaciones sobre una Lista
  • Listas Enlazadas Simples Lineales en C++